﻿#pragma once
#include "Tserial_event.h"

#define MAX_DEVICES 10
#define ADDRESS_LENGTH	6
#define NAME_LENGTH		30
#define SERIAL_BUFFER_CAPACITY	1
#define SERIAL_COM_NAME_LENGHT	8

///	\note Timpul în secunde este SEARCH_TIME * 1.28
#define SEARCH_TIME 4	// This is aprox 5 s

/// Structură de memorare a informaţiilor despre un echipament din raza de acţiune a BT
struct DeviceInfo
{
	/// Numele echipamentului i.e. 'MyPDA'
	wchar_t Name[ NAME_LENGTH ];
	/// Adresa fizică BT i.e. 00:40:D0:C5:C3:2D memorată pe o variablă int64
	ULONGLONG		Address;		// BTH_ADDR for Windows, BT_ADDR for PDA ; Microsoft knows better why.
	/// Şirul de caractere ce reprezintă adresa fizică
	unsigned char	AddressString[ADDRESS_LENGTH];
	/// Spune dacă echipamentul este conectat sau nu cu gazda pe care rulează acest cod
	unsigned char	IsPaired;
};

enum RESULT { OK, FAILED };

/// \brief Clasă abstractă ce standardizează comunicaţia prin BT.
/// \note Clasele derivate din ea implementează fizic comunicaţia i.e. Microsoft sau Bluesoleil
/// în timp ce respectă standardul impus aici
class BluetoothStack
{
public:
	// ======================================================================================
	//	Internal Events
	// ======================================================================================
	/// \brief Lansat atunci când operaţia de căutare s-a sfârşit
	HANDLE	searchCompleteEvent;
	
	// ======================================================================================
	//	Usefull data
	// ======================================================================================
	
	/// \brief Stochează informaţii despre echipamentele din rază
	DeviceInfo	Devices[MAX_DEVICES];
	
	/// \brief Numărul de echipamente găsite
	unsigned short	foundDevicesCount;

	// ===== Connection globals
	/// \brief Socketul pe care se comunică
	SOCKET			btSocket;
	/// \brief Adresa <i> interlocutorului </i>
	SOCKADDR_BTH	btService;
	/// \brief Handle la portul serial
	HANDLE			comPort;
	/// \brief Indexul portului i.e pentru COM3 comPortIndex = 3
	USHORT		comPortIndex;
	
	/// \brief Descrie starea emiţătorului BT i.e. oprit, vizibil sau conectabil
	DWORD			bluetoothMode;

	// ======================================================================================
	//	Interface
	// ======================================================================================
	BluetoothStack(void);
	virtual ~BluetoothStack(void);

	/// \brief Pregăteşte comunicaţia prin BT
	virtual RESULT InitBluetooth() = 0;

	/// \brief Porneşte căutarea altor echipamente
	virtual RESULT SearchDevices() = 0;

	/// \brief Conectează gazda la un alt echipament
	/// \param UINT8	Index în vectorul \ref Devices , unde sunt stocate informaţiile despre
	/// echipamentul la care vreau să mă conectez
	virtual RESULT Connect( UINT8 ) = 0;

	/// \brief Deconectează gazda de la un alt echipament . \see Connect
	virtual RESULT Disconnect( UINT8 ) = 0;

	/// \brief Trimite un şir de octeţi
	/// \param BYTE* Şirul de date trimis
	/// \param UINT16 Numărul de octeţi trimişi
	virtual RESULT Send( BYTE*, UINT16 ) = 0;
	
	/// \brief Recepţinează un şir de octeţi
	/// \param Char* Şirul de date primit
	/// \param UINT16 Numărul de octeţi primiţi
	virtual RESULT Receive( char*, UINT16) = 0;
};
